/*******************************************************************************
    Universidad del Valle de Guatemala
    Algoritmos y estructuras de datos
    Karen Tojin   08091
    Fecha: 30 de Julio de 2009
    Descricion: Programa que simula un banco, con el uso de colas
***************************************************************************** */

/**
 *
 * @author karenAndy
 */

import java.util.Scanner;
import java.util.ArrayList;

public class Driver {

    public static void main(String[] args){

        int tiempoBanco=0;
        final int totalClientes = 50;

        //***********************************************************************************************
        //-------------------SECCIÓN A MODIFICAR PARA EVALUAR LAS DOS IMPLEMENTACIONES-------------------
        ArrayList<ColasListaCircular<Cliente>> miBanco = new ArrayList<ColasListaCircular<Cliente>>();
        ColasListaCircular<Cliente> temp = new ColasListaCircular<Cliente>();
        //ArrayList<ColasArray<Cliente>> miBanco = new ArrayList<ColasArray<Cliente>>();
        //ColasArray<Cliente> temp = new ColasArray<Cliente>();
        //-------------------SECCIÓN A MODIFICAR PARA EVALUAR LAS DOS IMPLEMENTACIONES-------------------
        //***********************************************************************************************

        Cliente[] Clientes = new Cliente[totalClientes];

        int op=0;
        Scanner ingreso = new Scanner(System.in);

        for(int i=0; i<4; i++){
            miBanco.add(new ColasListaCircular<Cliente>());
            //***********************************************************************************************
            //-------------------SECCIÓN A MODIFICAR PARA EVALUAR LAS DOS IMPLEMENTACIONES-------------------
            //miBanco.add(new ColasArray<Cliente>());
            //-------------------SECCIÓN A MODIFICAR PARA EVALUAR LAS DOS IMPLEMENTACIONES-------------------
            //***********************************************************************************************
        }
        
        int t1;
        Integer[] tiempo1= new Integer[50];

        for (int i=0;i<50;i++){
            t1 = (int)(Math.random()*480+1);
            tiempo1[i]= t1;
        }

        Sorting(tiempo1);

        for(int i=0; i<50; i++){
            Cliente persona = new Cliente((int)tiempo1[i],(int)(Math.random()*30+1),"Cliente "+(i+1));
            Clientes[i]=persona;
            temp.Push(Clientes[i]);
        }

        /**
         * Ciclo que simula el paso del tiempo dentro del banco
         */
        while (tiempoBanco< 480) {
            try {
                for(int i=0; i<4; i++){
                    if (temp.Peek().gett1() == tiempoBanco) {
                        miBanco.get(i).Push(temp.Pop());
                        System.out.println("Ingreso un cliente en la cola "+(i+1));
                }

                }
            } catch (Exception exception) {
            }

            try {
                for(int i=0; i<4; i++){
                    if (tiempoBanco - miBanco.get(i).Peek().gett1() == miBanco.get(i).Peek().gett2()) {
                        miBanco.get(i).Pop();
                        System.out.println("Un cliente de la cola "+(i+1)+" fue atendidp");
                    }
                }
            } catch (Exception exception) {
            }
            tiempoBanco++;
        }

        /**
         * Cálculo del promedio del tiempo que pasan los clientes en el banco
         */
        int suma=0, promedio=0;

        for(int i=0; i<50; i++)
            suma+=Clientes[i].t2;
        
        promedio =  suma/50;


        //***********************************************************************************************
        //--------------------------------------------MENÚ DEL BANCO-------------------------------------

        do{
            System.out.println("\t\t.::: BANCO :::.");
            System.out.println();
            System.out.println("1. Ver promedio de estadía en el banco");
            System.out.println("2. Ver el estado de todos los clientes");
            System.out.println("3. Salir del menu");
            System.out.print("\nIngrese la opcion que desea realizar: ");
            op = ingreso.nextInt();

            while(op<1 || op>3){
                System.out.println("\nHa ingresado una opción inválida, por favor ingrésela de nuevo: ");
                op = ingreso.nextInt();
            }
            
            switch(op){
                case 1:
                    System.out.println("El tiempo total de todos los clientes fue: " + suma);
                    System.out.println("El tiempo promedio por cada cliente fue: " + promedio);
                break;

                case 2:
                    String estadoClientes="";
                    for (int i=4; i>=0; i--){
                        for (int j=0; j<Clientes.length; j++)
                                estadoClientes += Clientes[j].toString(i) +"\t";
                        estadoClientes+= "\n";
                    }
                break;
            }
        }
        while(op!=3);
        System.out.println("\n\n\t.::Gracias por usar este banco::.");

        //--------------------------------------------MENÚ DEL BANCO-------------------------------------
        //***********************************************************************************************
    }

    //***********************************************************************************************
    //-----------------------------MÉTODO DE ORDENAMIENTO POR SELECCIÓN-------------------------------

    public static void Sorting(Comparable[] list){
        int min;
        Comparable temp;

        for (int index = 0; index < list.length-1; index++)
        {
             min = index;
             for (int scan = index+1; scan < list.length; scan++)
                if (list[scan].compareTo(list[min]) < 0)
                   min = scan;

             // Swap the values
             temp = list[min];
             list[min] = list[index];
             list[index] = temp;
        }
    }
    
}
